package com.cosmoplat.xikai.business.domain;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * @ClassName AgvCallbackLog
 * @Description AGV回调日志实体类
 * @Author wdf
 * @Date 2025/9/3
 */
@Data
@ApiModel(value = "AGV回调日志实体类", description = "AGV回调日志实体类")
public class AgvCallbackLog {

    /**
     * 主键ID，使用雪花算法生成
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    /**
     * 请求编号，每个请求的唯一标识
     */
    private String reqCode;

    /**
     * 任务单号，关联的任务编号
     */
    private String taskCode;

    /**
     * 处理状态
     * 0-未处理，1-处理中，2-处理成功，3-处理失败，4-已调度继续任务
     */
    private Integer status;

    /**
     * 存储完整的请求入参(JSON格式)
     */
    private String data;

    /**
     * 创建时间，记录请求到达时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间，记录最后处理时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 方法类型：apply/release
     */
    private String method;

    /**
     * AGV编号
     */
    private String robotCode;

    /**
     * 继续任务调用结果(JSON格式)
     */
    private String continueTaskResult;

    public static AgvCallbackLog createLog(String reqCode, String taskCode, int unprocessed, String jsonString, String method, String robotCode) {
        AgvCallbackLog log = new AgvCallbackLog();
        log.setReqCode(reqCode);
        log.setTaskCode(taskCode);
        log.setStatus(unprocessed);
        log.setData(jsonString);
        log.setMethod(method);
        log.setRobotCode(robotCode);
        log.setCreateTime(LocalDateTime.now());
        log.setUpdateTime(LocalDateTime.now());
        return log;
    }


    /**
     * 状态常量定义
     * 0-申请进入 1-同意进入 2-拒绝进入 3-告知AGV成功 4-告知AGV失败 5-申请离开 6-完成
     */
    public static class Status {
        public static final int APPLY_IN = 0;      // 申请进入
        public static final int APPROVE = 1;       // 同意进入
        public static final int REJECT = 2;          // 拒绝进入
        public static final int CALL_SUCCESS = 3;          // 告知AGV 成功
        public static final int CALL_FAIL = 4;          // 告知AGV 失败
        public static final int APPLY_OUT = 5;           // 申请离开
        public static final int FINISHED = 6;        // 完成
    }
}
